gfloat xalign;
gint insert_pos;
guint blink_time; /* time in msec the cursor has blinked since last user event */
+ guint real_changed : 1;
+ guint change_count : 8;
};
typedef struct _GtkEntryPasswordHint GtkEntryPasswordHint;
static void connect_completion_signals (GtkEntry *entry,
GtkEntryCompletion *completion);
+static void begin_change (GtkEntry *entry);
+static void end_change (GtkEntry *entry);
+static void emit_changed (GtkEntry *entry);
G_DEFINE_TYPE_WITH_CODE (GtkEntry, gtk_entry, GTK_TYPE_WIDGET,
G_IMPLEMENT_INTERFACE (GTK_TYPE_EDITABLE,
G_CALLBACK (gtk_entry_delete_surrounding_cb), entry);
}
+static void
+begin_change (GtkEntry *entry)
+{
+ GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (entry);
+
+ priv->change_count++;
+}
+
+static void
+end_change (GtkEntry *entry)
+{
+ GtkEditable *editable = GTK_EDITABLE (entry);
+ GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (entry);
+
+ g_return_if_fail (priv->change_count > 0);
+
+ priv->change_count--;
+
+ if (priv->change_count == 0)
+ {
+ if (priv->real_changed)
+ {
+ g_signal_emit_by_name (editable, "changed");
+ priv->real_changed = FALSE;
+ }
+ }
+}
+
+static void
+emit_changed (GtkEntry *entry)
+{
+ GtkEditable *editable = GTK_EDITABLE (entry);
+ GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (entry);
+
+ if (priv->change_count == 0)
+ g_signal_emit_by_name (editable, "changed");
+ else
+ priv->real_changed = TRUE;
+}
+
/*
* Overwrite a memory that might contain sensitive information.
*/
gtk_entry_recompute (entry);
- g_signal_emit_by_name (editable, "changed");
+ emit_changed (entry);
g_object_notify (G_OBJECT (editable), "text");
}
gtk_entry_recompute (entry);
- g_signal_emit_by_name (editable, "changed");
+ emit_changed (entry);
g_object_notify (G_OBJECT (editable), "text");
}
}
g_signal_handler_block (entry, completion->priv->changed_id);
}
+ begin_change (entry);
+ g_object_freeze_notify (G_OBJECT (entry));
if (gtk_editable_get_selection_bounds (editable, &start, &end))
gtk_editable_delete_text (editable, start, end);
pos = entry->current_pos;
gtk_editable_insert_text (editable, text, length, &pos);
gtk_editable_set_position (editable, pos);
+ g_object_thaw_notify (G_OBJECT (entry));
+ end_change (entry);
if (completion &&
!popup_completion && completion->priv->changed_id > 0)
if (completion && completion->priv->changed_id > 0)
g_signal_handler_block (entry, completion->priv->changed_id);
+ begin_change (entry);
+ g_object_freeze_notify (G_OBJECT (entry));
gtk_editable_delete_text (GTK_EDITABLE (entry), 0, -1);
tmp_pos = 0;
gtk_editable_insert_text (GTK_EDITABLE (entry), text, strlen (text), &tmp_pos);
+ g_object_thaw_notify (G_OBJECT (entry));
+ end_change (entry);
if (completion && completion->priv->changed_id > 0)
g_signal_handler_unblock (entry, completion->priv->changed_id);
else
{
/* Replacing selection */
+ begin_change (entry);
+ g_object_freeze_notify (G_OBJECT (entry));
gtk_editable_delete_text (editable, sel1, sel2);
gtk_editable_insert_text (editable, str, length, &sel1);
+ g_object_thaw_notify (G_OBJECT (entry));
+ end_change (entry);
}
gtk_drag_finish (context, TRUE, context->action == GDK_ACTION_MOVE, time);